/*
 * task.h
 *
 *  Created on: Sep 23, 2015
 *      Author: rpi
 */

#ifndef TASK_H_
#define TASK_H_

#include <iostream>
#include <thread>
#include <memory>

class task : public std::enable_shared_from_this<task>
{
public:
	task()
		:exit_(false)
		,line_(-1)	{}

	task( const task & ) = delete;
	virtual ~task(){}
	task & operator =( const task &) = delete;

	void start();
	void stop()
	{
		exit_ = true;
		sync_.notify_one();
	}

	void set_job( const std::function<void()> & job, const std::string & file, int line)
	{//提交任务
		{
			std::unique_lock<std::mutex> lock(mutex_);
			job_ = job;
			file_ = file;
			line_ = line;
		}
		sync_.notify_one();//通知主线程有任务要执行....
	}

	void print_job(){
		//LOG(INFO)<<"sumbit from:"<<file_<<":"<<line_;
		std::cout << "submit from : " << file_ << " : " << line_;
	}

private:
	bool exit_;
	std::mutex mutex_;
	std::condition_variable sync_;
	std::function< void()> job_;          //线程执行的任务，线程任意时刻，最多只能执行一个任务。
	std::thread::id	id_;
	std::string	file_;
	int	line_;
};

void task::start()
{
	auto job_proxy = [this] ()
	{
		id_ = std::this_thread::get_id();
		while( !exit_ )
		{
			std::unique_lock<std::mutex> lock(mutex_);

			if( job_ )
			{//有任务了，需要执行任务了
				try
				{
				  job_(); //执行任务的代码
				}
				catch( std::exception & e)
				{
				}
				catch(...)
				{
				}

				job_ = std::function<void()>(); //释放任务绑定的资源，主要为闭包捕获的资源，特别是shared_ptr对象.
				tasks->job_completed( shared_from_this() ); //任务执行完成，通知线程池
				}
			else
			{
				//没有任务的时候，等待其他线程提交任务。。
				sync_.wait(lock);
			}
		}
	};

	std::thread t(job_proxy); //创建并启动与task管理的线程
	t.detach();               //分离模式，thread对象销毁了，但是其创建的线程还活着。。。
}

#endif /* TASK_H_ */
